用於獲取有關你的交易帳戶中開倉項目(或持倉)的詳細信息。這些函數可以讓我們查詢和分析持倉,並在需要時自動執行特定的交易策略或管理風險。
PositionGetSymbol():此函數用於獲取當前持倉的交易符號(金融資產,如外匯貨幣對、股票、期貨等)。
PositionGetInteger(POSITION_TYPE):這個函數可用於獲取特定類型持倉的整數值,其中POSITION_TYPE可能的值:
POSITION_TICKET:交易票號(持倉的唯一識別符)。
POSITION_TYPE:持倉類型(買入或賣出)。
POSITION_MAGIC:用於識別特定交易策略的魔術數字。
PositionGetDouble(POSITION_PROPERTY):這個函數可用於獲取特定持倉屬性的浮點數值,其中POSITION_PROPERTY可能的值:
POSITION_PRICE_OPEN:開倉價格。
POSITION_PRICE_CURRENT:當前市價。
POSITION_SL:止損價格。
POSITION_TP:止盈價格。
PositionGetInteger(POSITION_PROPERTY_INTEGER):這個函數用於獲取特定持倉整數屬性的值,例如POSITION_VOLUME(持倉數量)。
更多範例可以上https://www.mql5.com/en/docs/constants/tradingconstants/positionproperties
模塊化和可重用性:透過創建自定義函數,可以將部位修改的邏輯封裝在一個獨立的函數中。這使得代碼更模塊化,易於管理和維護。
錯誤處理:自定義函數可以包含錯誤處理機制,確保在修改部位時能夠處理可能出現的錯誤情況。這可以提高交易系統的穩定性和安全性。
可讀性:透過為部位修改創建自定義函數,可以使交易策略代碼更易讀和更易理解。這有助於我們或其他開發者更輕鬆地查看和維護代碼。
簡化策略邏輯:透過將部位修改的邏輯提取到自定義函數中,可以在交易策略的主要邏輯中保持清晰簡潔。這有助於減少代碼的複雜性,使您的策略更容易管理和優化。
可擴展性:隨著交易策略的演進,可能需要不斷添加新的功能和規則。自定義函數可以輕鬆擴展,允許您在需要時修改或添加部位修改的邏輯,而不必修改整個策略。
// 自定義函數,用於修改開倉部位的止損價和止盈價
void ModifyOpenPosition(int ticket, double newStopLoss, double newTakeProfit)
{
if (OrderSend(ticket, 0, newStopLoss, newTakeProfit, 0, 0, 0, "", 0, clrNONE) > 0)
{
Print("成功修改部位 #", ticket, " 的止損價和止盈價");
}
else
{
Print("修改部位 #", ticket, " 失敗,錯誤代碼:", GetLastError());
}
}
// 在您的交易策略中調用函數來修改開倉部位的止損價和止盈價
void OnStart()
{
int orderTicket = 12345;
double newStopLoss = 1.2500; // 新的止損價
double newTakeProfit = 1.2700; // 新的止盈價
// 調用自定義函數來修改部位的止損價和止盈價
ModifyOpenPosition(orderTicket, newStopLoss, newTakeProfit);
}
平倉是指關閉或部分關閉已經開立的交易倉位。
通常會平倉有以下幾點情況:
獲利平倉:決定在價格達到一定利潤目標時關閉部分或全部部位。 這可以幫助鎖定獲利並保護投資。
停損平倉:為了控制損失並保護資本,在價格達到設定的停損水準時關閉交易部位。
部分平倉:交易者可以選擇只關閉部位的一部分,以實現獲利或減少風險。 一部分被平倉,而另一部分則繼續保持。
逐步平倉:逐步平倉是分階段關閉交易,通常用於實現複雜的交易策略,例如加倉或減倉。
bool ClosePosition(int ticket, double lots, double price, int slippage, color clr=clrNONE)
{
bool result = OrderClose(ticket, lots, price, slippage, clr);
// 檢查操作是否成功
if(!result)
{
Print("平倉失敗,錯誤碼:", GetLastError());
return false;
}
return true;
}
//OnStart()中
if(ClosePosition(ticket, lots, price, slippage))
{
Print("成功平倉部位 #", ticket);
}
今天所分享的函數都可以像前幾天分享的文中一樣寫在類別裡,不過因為程式碼過於冗長,為了讓篇幅簡潔一點便使用了較精簡的寫法,不過在正式的EA中,這樣寫會忽略掉很多需要處理的因素,所以用在class中會比較便捷。